const toc = require("markdown-toc");

module.exports = function (blog) {
    // 生成TOC，但不是我们想要的格式，需要我们手动转换
    let tocJson = toc(blog.markdownContent).json;
    
    // 记录结果
    const result = [];  
    /**
     * 生成一项目录
     * @param {object} item 
     * @returns {
            name: item.content,
            lvl: item.lvl,
            anchor: item.slug
        }
     */
    function createItem(item) {
        return {
            name: item.content,
            lvl: item.lvl,
            anchor: item.slug
        }
    }

    /**
     * 去除lvl属性
     * @param {array} result 
     */
    function wipeLvlProp(result) {
        result.forEach(item => {
            delete item.lvl;
            if (item.children) {
                wipeLvlProp(item.children);
            }
        })
    }

    for (const t of tocJson) {
        // 1. 定义一项目录对象
        const item = createItem(t);

        // 2. 获取已经生成的最后一个 item，如果数组是空数组则获取到undefined，不为空则获取到最后一项 item
        const lastItem = result[result.length - 1];
        if (lastItem && item.lvl > lastItem.lvl) {
            // 进入此if证明此item需要作为某一个item的children，调用handler进行处理
            handler(lastItem, item);
        } else {
            // 不大于则直接将对象添加到 result 数组中
            result.push(item);
        }
    }

    function handler(pre, now) {
        // 1. 如果没有 children 属性则进行初始化
        if (!pre.children) pre.children = [];

        // 2. 判断当前这一项是否大于于 children 中的最后一项，如果大于则进行递归处理
        const prevItem = pre.children[pre.children.length - 1];
        if (prevItem && now.lvl > prevItem.lvl) {
            // 进入此if证明当前的 item 作为某个item的children的children
            handler(prevItem, now);
        } else {
            // 不大于则直接添加
            pre.children.push(now);
        }
    }

    // 去除每一个lvl属性
    wipeLvlProp(result);
    blog.toc = JSON.stringify(result);

    // 删除blog中的markdownContent属性
    delete blog.markdownContent;

    // 给每个标题标签添加id
    for (const item of tocJson) {
        switch (item.lvl) {
            case 1:
                blog.htmlContent = blog.htmlContent.replace("<h1>", `<h1 id="${item.slug}">`);
                break;
            case 2:
                blog.htmlContent = blog.htmlContent.replace("<h2>", `<h2 id="${item.slug}">`);
                break;
            case 3:
                blog.htmlContent = blog.htmlContent.replace("<h3>", `<h3 id="${item.slug}">`);
                break;
            case 4:
                blog.htmlContent = blog.htmlContent.replace("<h4>", `<h4 id="${item.slug}">`);
                break;
            case 5:
                blog.htmlContent = blog.htmlContent.replace("<h5>", `<h5 id="${item.slug}">`);
                break;
            case 6:
                blog.htmlContent = blog.htmlContent.replace("<h6>", `<h6 id="${item.slug}">`);
                break;
        }
    }
    // return result;
}